package utils

import (
	"encoding/binary"
	"encoding/json"
	"fmt"
	"github.com/boyane/chartroom/common/message"
	"net"
)

type Transfer struct {
	Conn net.Conn
	Buf [1024]byte
}

// 封装的发送包函数
func (this *Transfer) WritePkg(data []byte) (err error){
	// 发送数据长度
	var pkgLen uint32
	pkgLen = uint32(len(data))

	binary.BigEndian.PutUint32(this.Buf[:4], pkgLen)

	_, err = this.Conn.Write(this.Buf[:4])
	if err != nil{
		fmt.Println("发送数据长度错误")
		return
	}

	// 发送消息本身
	_, err = this.Conn.Write(data)
	if err != nil{
		fmt.Println("发送数据本身错误")
		return
	}
	return
}

// 封装的读取包函数
func (this *Transfer) ReadPkg() (mes message.Message, err error) {
	// 读取发送消息的长度
	_, err = this.Conn.Read(this.Buf[:4])
	if err != nil{
		fmt.Println("conn.Read", err)
		return
	}

	var pakLen uint32
	pakLen = binary.BigEndian.Uint32(this.Buf[:4])
	// 读取消息本身
	n, err := this.Conn.Read(this.Buf[:pakLen])
	if n != int(pakLen) || err != nil{
		fmt.Println("读取消息本身错误 err =", err)
		return
	}

	// 序列化消息
	err = json.Unmarshal(this.Buf[:pakLen], &mes)
	if err != nil{
		fmt.Println("json.Unmarshal err=", err)
		return
	}
	return
}